package com.example.designpatterns.model.strategy;

import com.example.designpatterns.model.strategy.create.StrategyFactory;
import com.example.designpatterns.model.strategy.define.ConcreteStrategyA;
import com.example.designpatterns.model.strategy.define.Strategy;

import java.io.FileInputStream;
import java.util.Properties;

/**
 * Created by zyy on 2022/1/4.
 */
public class Application {

    // 运行时动态确定，根据配置文件的配置决定使用哪种策略
    public static void main(String[] args) throws Exception {
        Strategy strategy = null;
        Properties props = new Properties();
        props.load(new FileInputStream("./config.properties"));
        String type = props.getProperty("eviction_type");
        strategy = StrategyFactory.getStrategy(type);
//        UserCache userCache = new UserCache(evictionStrategy);
        strategy.algorithmInterface();
    }

}


/**
 * “非运行时动态确定”，也就是第二个 Application 中的使用方式，并不能发挥策略模式的优势。
 * 在这种应用场景下，策略模式实际上退化成了“面向对象的多态特性”或“基于接口而非实现编程原则”。
 */

// 非运行时动态确定，在代码中指定使用哪种策略
class Application2 {
    public static void main(String[] args) {
        ConcreteStrategyA strategyA = new ConcreteStrategyA();
        strategyA.algorithmInterface();
        // UserCache userCache = new UserCache(evictionStrategy); //... }}
    }
}
